﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Numerics;
using System.IO;

namespace elcalc
{
    public partial class BelastningsPlan : Form
    {
        public BelastningsPlan()
        {
            InitializeComponent();
            BelastningsPlanView.EditingControlShowing -= new DataGridViewEditingControlShowingEventHandler(BelastningsPlanView_EditingControlShowing);
            BelastningsPlanView.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(BelastningsPlanView_EditingControlShowing);
            
        }

        public BelastningsPlan(ArrayList forbrugsListe)
        {
            InitializeComponent();
            BelastningsPlanView.EditingControlShowing -= new DataGridViewEditingControlShowingEventHandler(BelastningsPlanView_EditingControlShowing);
            BelastningsPlanView.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(BelastningsPlanView_EditingControlShowing);

            button1.Visible = false;
            button2.Visible = false;
            
            for (int i = 0; i < forbrugsListe.Count; i++)
            {
                BelastningsPlanView.Rows.Add();
                BelastningsPlanView["Navn", i].Value = ((Forbrug)forbrugsListe[i]).Navn;
                BelastningsPlanView["Last", i].Value = ((Forbrug)forbrugsListe[i]).last.ToString();
                BelastningsPlanView["Forbrug", i].Value = string.Format(new KompleksFormat(), "{0:<0}", Complex.FromPolarCoordinates(((Forbrug)forbrugsListe[i]).Strøm, ((Forbrug)forbrugsListe[i]).Phi));
                
                //BelastningsPlanView["Forbrug",i].Value
            }
        }

        void BelastningsPlanView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            
            
            ComboBox combo = e.Control as ComboBox;
            if (combo != null)
            {
                combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
                combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
                

            }
            /*
            TextBox text = e.Control as TextBox;
            if (text != null)
            {
                text.TextChanged -= new EventHandler(TextBox_TextChanged);
                text.TextChanged += new EventHandler(TextBox_TextChanged);
                //System.Diagnostics.Debug.WriteLine("test");
            }*/
        }



        void TextBox_TextChanged(object sender, EventArgs e)
        {
            int rowIndex = BelastningsPlanView.CurrentCell.RowIndex;
            int columnIndex = BelastningsPlanView.CurrentCell.ColumnIndex;
            string[] stringArray = { "L1", "L2", "L3" };
            System.Diagnostics.Debug.WriteLine(BelastningsPlanView.Columns[columnIndex].Name);
            if (stringArray.Contains(BelastningsPlanView.Columns[columnIndex].Name))
            {
                System.Diagnostics.Debug.WriteLine("test");
            }
            
        }

        private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            //Console.WriteLine(((ComboBox)sender).Parent);
            int rowIndex = BelastningsPlanView.CurrentCell.RowIndex;
            int columnIndex = BelastningsPlanView.CurrentCell.ColumnIndex;

            BelastningsPlanView["L1", rowIndex].Value = null;
            BelastningsPlanView["L2", rowIndex].Value = null;
            BelastningsPlanView["L3", rowIndex].Value = null;
           // ((ComboBox)sender).SelectedValue.ToString();



            if (BelastningsPlanView["Forbrug", rowIndex].Value != null)
            {
                string str = BelastningsPlanView["Forbrug", rowIndex].Value.ToString();
                string[] strArray = str.Split(new char[] { '<' });
                //Complex forbrug = new Complex(double.Parse(strArray[0]),double.Parse(strArray[1]));
                Complex forbrug;
                if (strArray.Length > 1)
                {
                     forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), double.Parse(strArray[1]) * (Math.PI / 180));
                }
                else
                {
                     forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), 0);
                }

                Complex forbrugM30 = Complex.FromPolarCoordinates(double.Parse(strArray[0]), forbrug.Phase - 30 * (Math.PI / 180));
                Complex forbrugP30 = Complex.FromPolarCoordinates(double.Parse(strArray[0]), forbrug.Phase + 30 * (Math.PI / 180));
               
                switch (((ComboBox)sender).SelectedItem.ToString())
                {
                    case "L1N":
                        //BelastningsPlanView["L1", rowIndex].Value = BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L1", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);
                        break;
                    case "L2N":
                        BelastningsPlanView["L2", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L3N":
                        BelastningsPlanView["L3", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L2":
                        BelastningsPlanView["L1", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L2", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L2L3":
                        BelastningsPlanView["L2", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L3":
                        BelastningsPlanView["L1", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L2L3":
                        BelastningsPlanView["L1", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L2", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", rowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                }
            }
            //BelastningsPlanView_CellValueChanged(sender, e);
        }

        private void BelastningsPlanView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex == -1)
                return;

            string[] stringArray = { "L1", "L2", "L3" };
            
           // int columnIndex = BelastningsPlanView.SelectedCells[0].ColumnIndex;
            if (stringArray.Contains(BelastningsPlanView.Columns[e.ColumnIndex].Name))
            //if (stringArray.Contains(BelastningsPlanView.Columns[columnIndex].Name))
            {
                Complex l1 = new Complex();
                Complex l2 = new Complex();
                Complex l3 = new Complex();
                string[] splittetL1;
                string[] splittetL2;
                string[] splittetL3;

                foreach (DataGridViewRow row in BelastningsPlanView.Rows)
                {

                    string strengL1 = row.Cells["L1"].Value as string;
                    string strengL2 = row.Cells["L2"].Value as string;
                    string strengL3 = row.Cells["L3"].Value as string;

                    if (strengL1 != null)
                    {
                        splittetL1 = strengL1.Split(new string[] { " < " }, StringSplitOptions.RemoveEmptyEntries);

                        l1 = Complex.Add(l1, Hjælper.ParseComplex(strengL1));
                        //l1 = Complex.Add(l1, Complex.FromPolarCoordinates(double.Parse(splittetL1[0]), double.Parse(splittetL1[1]) * (Math.PI / 180)));
                    }

                    if (strengL2 != null)
                    {
                        splittetL2 = strengL2.Split(new string[] { " < " }, StringSplitOptions.RemoveEmptyEntries);

                        l2 = Complex.Add(l2, Hjælper.ParseComplex(strengL2));
                        //l2 = Complex.Add(l2, Complex.FromPolarCoordinates(double.Parse(splittetL2[0]), double.Parse(splittetL2[1]) * (Math.PI / 180)));
                    }

                    if (strengL3 != null)
                    {
                        splittetL3 = strengL3.Split(new string[] { " < " }, StringSplitOptions.RemoveEmptyEntries);

                        l3 = Complex.Add(l3, Hjælper.ParseComplex(strengL3));
                        //l3 = Complex.Add(l3, Complex.FromPolarCoordinates(double.Parse(splittetL3[0]), double.Parse(splittetL3[1]) * (Math.PI / 180)));
                    }
                }

                L1Field.Text = string.Format(new KompleksFormat(), "{0:<2}", l1);
                L2Field.Text = string.Format(new KompleksFormat(), "{0:<2}", l2);
                L3Field.Text = string.Format(new KompleksFormat(), "{0:<2}", l3);
            }

            if (BelastningsPlanView.Columns[e.ColumnIndex].Name == "Forbrug" & BelastningsPlanView["Last",e.RowIndex].Value != null)
            {
                string str = BelastningsPlanView["Forbrug", e.RowIndex].Value.ToString();
                string[] strArray = str.Split(new char[] { '<' });

                double angle;
                Complex forbrug;

                if (strArray.Length > 1)
                {
                    if (double.TryParse(strArray[1], out angle))
                    {
                        forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), angle * (Math.PI / 180));// double.Parse(strArray[1]) * (Math.PI / 180));
                    }
                    else
                    {
                        forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), 0);// double.Parse(strArray[1]) * (Math.PI / 180));
                    }
                }
                else
                    forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), 0);// double.Parse(strArray[1]) * (Math.PI / 180));
                 //forbrug = Complex.FromPolarCoordinates(double.Parse(strArray[0]), double.TryParse(strArray[1]) * (Math.PI / 180));// double.Parse(strArray[1]) * (Math.PI / 180));

                Complex forbrugM30 = Complex.FromPolarCoordinates(double.Parse(strArray[0]), forbrug.Phase - 30 * (Math.PI / 180));
                Complex forbrugP30 = Complex.FromPolarCoordinates(double.Parse(strArray[0]), forbrug.Phase + 30 * (Math.PI / 180));

                switch (BelastningsPlanView["Last", e.RowIndex].Value.ToString())
                {
                    case "L1N":
                        //BelastningsPlanView["L1", rowIndex].Value = BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L1", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);
                        break;
                    case "L2N":
                        BelastningsPlanView["L2", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L3N":
                        BelastningsPlanView["L3", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L2":
                        BelastningsPlanView["L1", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L2L3":
                        BelastningsPlanView["L2", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugM30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrugP30);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                    case "L1L2L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = string.Format(new KompleksFormat(), "{0:<2}", forbrug);//BelastningsPlanView["Forbrug", rowIndex].Value;
                        break;
                        /*
                    case "L1N":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L2N":
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L3N":
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L2":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L2L3":
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L2L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;*/
                }
            }
                /*
            else if (BelastningsPlanView.Columns[e.ColumnIndex].Name == "Last" & BelastningsPlanView["Forbrug", e.RowIndex].Value != null)
            {
                switch (BelastningsPlanView["Last", e.RowIndex].Value.ToString())
                {
                    case "L1N":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L2N":
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L3N":
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L2":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L2L3":
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                    case "L1L2L3":
                        BelastningsPlanView["L1", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L2", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        BelastningsPlanView["L3", e.RowIndex].Value = BelastningsPlanView["Forbrug", e.RowIndex].Value;
                        break;
                }
            }*/
        }

        private void button1_Click(object sender, EventArgs e)
        {

            Stream myStream;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = saveFileDialog1.OpenFile()) != null)
                {

                    DataTable dt = new DataTable("Forbrug");

                    for (int i = 0; i < BelastningsPlanView.ColumnCount; i++)
                    {
                        dt.Columns.Add(BelastningsPlanView.Columns[i].Name, typeof(System.String));
                    }

                    foreach (DataGridViewRow row in BelastningsPlanView.Rows)
                    {
                        DataRow myRow = dt.NewRow();
                        for (int i = 0; i < BelastningsPlanView.ColumnCount; i++)
                        {
                            myRow[i] = row.Cells[i].Value;
                        }
                        dt.Rows.Add(myRow);
                    }

                    dt.WriteXml(myStream,XmlWriteMode.WriteSchema,true);

                    myStream.Close();
                }
            }
            /*
            DataTable dt = new DataTable("Forbrug");

            for (int i = 0; i < BelastningsPlanView.ColumnCount; i++)
            {
                dt.Columns.Add(BelastningsPlanView.Columns[i].Name, typeof(System.String));
            }

            foreach (DataGridViewRow row in BelastningsPlanView.Rows)
            {
                DataRow myRow = dt.NewRow();
                for (int i = 0; i < BelastningsPlanView.ColumnCount; i++)
                {
                    myRow[i] = row.Cells[i].Value;
                }
                dt.Rows.Add(myRow);
            }

            dt.WriteXml(@"test.xml");*/
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Stream myStream = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory = "c:\\";
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((myStream = openFileDialog1.OpenFile()) != null)
                    {
                        using (myStream)
                        {
                            DataTable dt = new DataTable("Forbrug");
                            dt.ReadXml(myStream);

                            DataRow row;

                            BelastningsPlanView.Rows.Clear();

                            for (int i = 0; i < dt.Rows.Count - 1; i++)
                            {
                                row = dt.Rows[i];
                                BelastningsPlanView.Rows.Add(row.ItemArray);
                            } 
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                }
            }



        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (this.BelastningsPlanView.GetCellCount(DataGridViewElementStates.Selected) > 0)
            {
                try
                {
                    // Add the selection to the clipboard.
                    Clipboard.SetDataObject(
                        this.BelastningsPlanView.GetClipboardContent());

                    // Replace the text box contents with the clipboard text.
                    //this.TextBox1.Text = Clipboard.GetText();
                }
                catch (System.Runtime.InteropServices.ExternalException)
                {
                    //this.TextBox1.Text = "The Clipboard could not be accessed. Please try again.";
                }
            }

        }
    }
}
